package preguntas;



import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Collections;
import java.util.ArrayList;
import java.util.Properties;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;

import utilidades.FileUtilities;
import utilidades.PropertiesFile;



public class PreguntaInsercionDirecta {
	private static ArrayList<Integer>insDir, insDir2, original, arrayObjetivo;
	private static int step=0, pasoAbuscar;


	public static void main(String args[]) throws FileNotFoundException, IOException {	
		Random rnd = new Random();		
		Properties properties = new PropertiesFile().getProperties();		
		int seed;
		int seedProperty;
		int iDSize;
		String property;		
		String xmlFormat="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n ";
		String giftFormat="";
		String feedBack="";
		String question="";
		
		String filenameXml="Preguntas/InsercionDirecta/PreguntaInsercionDirectaXml.xml";
		String filenameGift="Preguntas/InsercionDirecta/PreguntaInsercionDirectaGift.txt";
		
		
		File fileXml=FileUtilities.createFile(filenameXml);
		File fileGift=FileUtilities.createFile(filenameGift);
		
		xmlFormat=xmlFormat+"<quiz>\r\n\t <question type=\"category\">\r\n\t <category>\r\n\t <text>Estructura de datos</text>\r\n </category>\r\n </question>";
		property=properties.getProperty("IDSize");	
		iDSize=Integer.parseInt(property);			
		
		property=properties.getProperty("seedID");			
		seedProperty=Integer.parseInt(property);
		
		if(seedProperty==-1)
			seed= (int) java.lang.Math.round(Math.random()*999999999+0);
		else
			seed=seedProperty;
		rnd.setSeed(seed);

		 xmlFormat=xmlFormat+" <question type=\"cloze\"> \r\n\t <name> \r\n\t <text>pregunta de Insercion Directa  con seed="+seed +"</text>\r\n</name> \r\n<questiontext format=\"html\">\r\n\t <text>\r\n\t ";
		 giftFormat=giftFormat+"::Pregunta Insercion Directa seed="+seed +"::\r\n";
		 
		 ArrayList<Integer>aux= new ArrayList<Integer>();
		 for(int i=0;i<99;i++)
			 aux.add(i);		 	
		 Collections.shuffle(aux, rnd);			 

		 insDir= new ArrayList<Integer>();
		 insDir2= new ArrayList<Integer>();
		 original= new ArrayList<Integer>();
		 for(int i=0;i<iDSize;i++){
			 insDir.add(i, aux.get(i));					
			 insDir2.add(i, aux.get(i));
			 original.add(i, aux.get(i));
		 }		
		 
	
		 
		 insercionDirecta(insDir);	
    	
		 pasoAbuscar= 3+(new Random()).nextInt(step-2);
		
		 
		 xmlFormat=xmlFormat+" <![CDATA[<p>Ordene mediante Insercion Directa la siguiente secuencia  ";
		 giftFormat=giftFormat+"Ordene mediante Insercion Directa la siguiente secuencia  ";
		 question=question+"Ordene mediante Insercion Directa la siguiente secuencia  ";
		 for(int i=0;i<iDSize;i++)
		 {
			 xmlFormat=xmlFormat+ original.get(i)+" ";
		 	giftFormat=giftFormat+ original.get(i)+" ";
		 	 question=question+original.get(i)+" ";
		 }
		 xmlFormat=xmlFormat+"e Introduzca la secuencia en el paso numero "+ pasoAbuscar;
		 giftFormat=giftFormat+"e Introduzca la secuencia en el paso numero "+ pasoAbuscar;
		 question=question+"\ne Introduzca la secuencia en el paso numero "+ pasoAbuscar+"\n La respuesta es: ";
		 
		 giftFormat=giftFormat+"{\r\n ";
		 xmlFormat=xmlFormat+" </p> ";		 
		 insDir=insDir2;
		 
		insercionDirecta(insDir);	

		 xmlFormat=xmlFormat+"<p> ";
		 giftFormat=giftFormat+"=%100%";
		 
		 for (int i=0;i<iDSize;i++)
		 {
			 xmlFormat=xmlFormat+"{1:MULTICHOICE:";
			 giftFormat=giftFormat+arrayObjetivo.get(i)+" ";
			 feedBack="El resultado correcto es la letra "+arrayObjetivo.get(i);
			 question=question+arrayObjetivo.get(i)+" ";
			 for(int j=0;j<original.size();j++)
			 {
				 if(j==0)
				 {
					 if(original.get(j)!=arrayObjetivo.get(i))
						 xmlFormat=xmlFormat+"~";
					 else
						 xmlFormat=xmlFormat+"=";
				 }
				 else
				 {
					 xmlFormat=xmlFormat+"~";
					 if(original.get(j)==arrayObjetivo.get(i))
						 xmlFormat=xmlFormat+"=";
				 }
				
				 xmlFormat=xmlFormat+original.get(j)+"#"+feedBack;
				 
			 }
			 xmlFormat=xmlFormat+"} ";
			 //System.out.println(enunciado.toString());
		 }
		 xmlFormat=xmlFormat+" </p> </p>]]>\r\n</text> \r\n </questiontext>\r\n <generalfeedback format=\"html\"> \r\n\t <text/> \r\n</generalfeedback>\r\n </question>\r\n	</quiz>\r\n";
		 giftFormat=giftFormat+"\r\n}"; 
		
		 
		 FileUtilities.writeFile(fileXml, xmlFormat); 
		 FileUtilities.writeFile(fileGift, giftFormat);
			Logger.getLogger("logger").log(Level.INFO,question+"\n");
	}
	
	
	


	public static  ArrayList<Integer> insercionDirecta(ArrayList<Integer>insDir){
		
	
		int aux, cambios=0,cambiosAnt=0;
		step=0;
		for(int i=1; i<insDir.size(); i++){			
			aux=(Integer)insDir.get(i);
			int j=i-1;
			
			while(j>=0 && (Integer)insDir.get(j)>aux){
				insDir.set(j+1, insDir.get(j));
				j--;
				cambios++;				
			}
			insDir.set(j+1, aux);
			
			if(cambios!=cambiosAnt){
				step++;
				cambiosAnt=cambios;
			}
			
			
			if(step==pasoAbuscar){
				arrayObjetivo= new ArrayList<Integer>();
				for(int x=0; x<insDir.size(); x++)
					arrayObjetivo.add(x, insDir.get(x));
				
			}			
		}
		return arrayObjetivo;
	}	
	
	public void setPasoAbuscar(int paso)
	{
		pasoAbuscar=paso;
	}
	
	public void setinsDir(ArrayList<Integer>array)
	{
		for(int i=0;i<array.size();i++)
		{
			insDir.add(array.get(i));
		}
	}
	
	public ArrayList<Integer> getarrayObjetivo()
	{
		return arrayObjetivo; 
	}
}
